package ue3;

import java.util.ArrayList;
import java.util.List;

import com.hp.hpl.jena.query.QueryExecException;
import com.hp.hpl.jena.query.QueryExecution;
import com.hp.hpl.jena.query.QueryExecutionFactory;
import com.hp.hpl.jena.query.ResultSet;
import com.hp.hpl.jena.query.ResultSetFormatter;
import com.hp.hpl.jena.rdf.model.InfModel;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.reasoner.Reasoner;
import com.hp.hpl.jena.reasoner.ReasonerRegistry;
import com.hp.hpl.jena.util.FileManager;

/**
*
* @author lazafi
*/

public class QueryReasoner {
    static List<String> queries;

    private Model schema = FileManager.get().loadModel("file:files/ontologie.owl");;
    private Model data = FileManager.get().loadModel("file:files/instanzen.rdf");;
    private Reasoner reasoner = ReasonerRegistry.getOWLMiniReasoner();;
    private InfModel infmodel;
    
    public QueryReasoner() {
        reasoner = reasoner.bindSchema(schema);
        infmodel = ModelFactory.createInfModel(reasoner, data);
   	
    };
    public void query (String query) {
    	ResultSet result;
    	boolean boresult;
    	QueryExecution exec = QueryExecutionFactory.create(query, infmodel);

    	try {
    		  	result = exec.execSelect();
        		ResultSetFormatter.out(System.out, result);
		} catch (QueryExecException qee) {
			boresult = exec.execAsk();
    		System.out.println(boresult?"JA":"NEIN");
		} catch (Exception e) {
			e.printStackTrace();
		}
    };
    
    public static void main(String[] args) {
		QueryReasoner qr = new QueryReasoner();
		ArrayList<String> queries = new ArrayList<String>();
		System.out.println(args.length);
		if (args.length > 0) {
		//	queries.addAll(0, new Array(args));
		}
		else {
			// Welche Kommunikationsgeraete kann Person "Verena" benutzen?
			queries.add("PREFIX UE1:<http://www.big.tuwien.ac.at/curses/ESW/UE1#>" + 
	   	    		"SELECT ?geraetname WHERE { " +
	   	    		"?person UE1:verwendet ?geraet." + 
	   	    		"?person UE1:name 'Verena'. " +
	   	    		"?geraet UE1:name ?geraetname ." + 
	   	    		"}");
			// Welche Applikationen werden durch die von Person "Verena" benutzbaren Geraete zur Verfuegung gestellt?
	   		queries.add("PREFIX UE1:<http://www.big.tuwien.ac.at/curses/ESW/UE1#>" + 
	   	    		"SELECT DISTINCT ?applicationname WHERE { " +
	   	    		"?person UE1:verwendet ?geraet." + 
	   	    		"?person UE1:name 'Verena'. " +
	   	    		"?geraet UE1:bietetApplikation ?application ." +
	   	    		"?application UE1:name ?applicationname ." +
	   	    		"}");
	   		//Kennt Person "Verena" die Kontaktdaten von Person "Simon"?
	   		queries.add("PREFIX UE1:<http://www.big.tuwien.ac.at/curses/ESW/UE1#>" + 
	    		"ASK { " +
   	    		"?person UE1:name 'Verena' ." +
   	    		"?person2 UE1:name 'Simon' ." +
   	    		"?person UE1:kennt ?person2 ." + 
   	    		"?person UE1:kannKontaktieren ?person2 . " +
	    		"}");
	   		// Welche Geschwindigkeit weist Applikation "SMS" auf?
	   		queries.add("PREFIX UE1:<http://www.big.tuwien.ac.at/curses/ESW/UE1#>" + 
	   	    		"SELECT ?sms_geschwindigkeit WHERE { " +
	   	    		"?applikation UE1:name 'SMS' ." + 
	   	    		"?applikation UE1:hatGeschwindigkeit ?geschwindigkeit . " +
	   	    		"?geschwindigkeit UE1:name ?sms_geschwindigkeit ." +
	   	    		"}");
	   		// Ist eine Kommunikation mittels Applikation "SMS" persistent?
	   		queries.add("PREFIX UE1:<http://www.big.tuwien.ac.at/curses/ESW/UE1#>" + 
	   	    		"ASK { " +
	   	    		"?applikation UE1:name 'SMS' ." + 
	   	    		"?applikation UE1:istPersistent ?smspersistence . " +
	   	    		"?smspersistence UE1:name 'ja' ." +
	   	    		"}");
	   	    		
	   		// Welche Applikationen kann Person "Anna" benutzen, um mit Person "Bruno" in Kontakt zu treten?
	   		queries.add("PREFIX UE1:<http://www.big.tuwien.ac.at/curses/ESW/UE1#>" + 
	   	    		"SELECT ?moegliche_applikationen WHERE { " +
	   	    		"?person1 UE1:name 'Verena' ." + 
	   	    		"?person2 UE1:name 'Simon' ." + 
	   	    		"?person1 UE1:kannKontaktieren ?person2 ." + 
	   	    		"?person1 UE1:nutzt ?applikation ." +
	   	    		"?person2 UE1:nutzt ?applikation . " +
	   	    		"?applikation UE1:name ?moegliche_applikationen . " +
	   	    		"}");
	   		// Bietet das Kommunikationsgeraet "Nokia 3210" die Applikation "SMS"?
	   		queries.add("PREFIX UE1:<http://www.big.tuwien.ac.at/curses/ESW/UE1#>" + 
	   	    		"ASK { " +
	   	    		"?geraet UE1:name 'Nokia 3100' ." + 
	   	    		"?geraet UE1:bietetApplikation ?applikation . " +
	   	    		"?applikation UE1:name 'SMS' ." +
	   	    		"}");
	   	    
    	}
    	for (String str: queries) {
    		System.out.print("\n+++++++++++++++++++++++++++++++++++++++++\n");
    		System.out.println("Query:");
    		System.out.println(str);
    		System.out.println("Ergebnis:");
    		System.out.println();
    		qr.query(str);
    	}
    }
}
